#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <fcntl.h>

//缓冲区的引出
int main()
{
    printf("hello printf\n");
    fprintf(stdout,"hello fprintf\n");
    const char* str = "hello fputs\n";
    fputs(str,stdout);

    char buffer[] = "hello write\n";
    write(stdout->_fileno,buffer,strlen(buffer));

    fork();
    // ./test 运行后打印4条信息
    // ./test > log.txt，cat log.txt可以发现C语言的打印了6条，系统打印了1条
    //原因：
    //C语言接口提供了缓冲区，它存在于FILE中
    //stdout默认是行缓冲，在fork之前，三条C语言打印已经刷新到了显示器上，你的缓冲区就不存在对应的数据了
    //如果我们进行了>,写入的就不再是显示器了，而是普通文件，普通文件的刷新策略是全缓冲，之前的3条c语言打印虽然带了\n,但不足以填满缓冲区
    //所以，在fork之前，缓冲区的数据仍然存在
    //又由于写时拷贝，子进程将会拥有同父进程一样的缓冲区，并且子进程创建后立即就退出，进程退出就会立即刷新缓冲区，所以子进程也会打印3条C语言的打印内容
    //write为什么没有打印两条呢？ write属于系统调用，write没有FILE，只有fd，所以write就没有所谓的缓冲区

    return 0;
}